package cn.ccit.action;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;

import cn.ccit.base.BaseConstants;
import cn.ccit.entites.DiningTable;
import cn.ccit.model.BaseModel;
import cn.ccit.util.GsonUtil;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 
 * @类功能说明：  所有action的基类
 * @类修改者：  wanghao
 * @param <T>
 * @param <T>
 * @修改日期：2016年10月15日 上午12:33:57  
 * @修改说明：  添加默认增删改查,以及发送成功数据和失败数据
 * @公司名称：ccit  
 * @作者：wanghao  
 * @创建时间：2016年10月15日 上午12:33:57  
 * @版本：V1.1
 */
public class BaseAction extends ActionSupport implements Serializable{
	private static final long serialVersionUID = 1L;
	protected static final Log log = LogFactory.getLog(BaseAction.class);
	
	protected int startId,
	  			limit;
	 private File file;
	 private String fileFileName;
	 private String fileContentType;
	public int getStartId() {
		return startId;
	}
	public void setStartId(int startId) {
		this.startId = startId;
	}
	public int getLimit() {
		return limit;
	}
	public void setLimit(int limit) {
		this.limit = limit;
	}
	public String addData() {
		return Action.SUCCESS;
	}
	public String removeData() {
		return Action.SUCCESS;
	}
	public String changeDataInfo() {
		return Action.SUCCESS;
	}
	public String getDataList() {
		return Action.SUCCESS;
	}
	public String sreachDataById() {
		return Action.SUCCESS;
	}
	public String sreachDataByName() {
		return Action.SUCCESS;
	}
	
	/**
	 * 
	 * @方法功能说明：  判断方法是否成功执行，成功发送正确状态码，失败发送失败状态码
	 * @创建：2016年11月5日 by wanghao  
	 * @修改：日期 by 修改者  
	 * @修改内容：  
	 * @参数： @param isSucessful
	 * @参数： @param ba      
	 * @return void     
	 * @throws
	 */
	protected <T> void sendJsonData(boolean isSucessful,BaseModel<T> ba) {
		if(isSucessful){
			setSuccessState(ba, null);
		}else{
			setFailState(ba);
		}
	}
	
	
	/**
	 * 
	 * @方法功能说明：  判断方法是否成功执行，成功发送json正确状态码并添加数据，失败发送失败状态码
	 * @创建：2016年11月5日 by wanghao   
	 * @修改：日期 by 修改者  
	 * @修改内容：  
	 * @参数： @param isSucessful
	 * @参数： @param ba
	 * @参数： @param data      
	 * @return void     
	 * @throws
	 */
	protected <T> void sendJsonData(boolean isSucessful,BaseModel<T> ba,T data) {
		if(isSucessful){
			setSuccessState(ba, data);
		}else{
			setFailState(ba);
		}
	}
	
	/**
	 * 
	 * @方法功能说明：   判断方法是后获取list以及size大小，不为空判断size不为零发送json正确状态码并添加数据
	 * 			为零发送空数据状态码，失败发送失败状态码
	 * @创建：2016年11月5日 by wanghao   
	 * @修改：日期 by 修改者  
	 * @修改内容：  
	 * @参数： @param dataList
	 * @参数： @param ba
	 * @参数： @param data      
	 * @return void     
	 * @throws
	 */
	protected <T> void sendJsonDataList(List<T> dataList,BaseModel<List<T>> ba) {
		if(dataList!=null){
			if(dataList.size()>0){
				setSuccessState(ba, dataList);
			}else{
				setNullDataState(ba);
			}
		}else{
			setFailState(ba);
		}
	}
	/**
	 * 
	 * 方法功能说明：  判断方法是后获取Map以及size大小，不为空判断size不为零发送json正确状态码并添加数据
	 * 			为零发送空数据状态码，失败发送失败状态码
	 * 创建：2016年11月14日 by Administrator   
	 * 修改：日期 by 修改者  
	 * 修改内容：  
	 * @参数： @param dataMap
	 * @参数： @param ba      
	 * @return void     
	 * @throws
	 */
	
	protected <T> void sendJsonDataMap(Map<String,Object> dataMap,BaseModel<Map<String,Object>> ba) {
		if(dataMap!=null){
			if(dataMap.size()>0){
				setSuccessState(ba, dataMap);
			}else{
				setNullDataState(ba);
			}
		}else{
			setFailState(ba);
		}
	}
	
	
	/**
	 * 
	 * 方法功能说明：  发送失败状态码
	 * 创建：2016年11月5日 by wanghao   
	 * 修改：日期 by 修改者  
	 * 修改内容：  
	 * @参数： @param ba      
	 * @return void     
	 * @throws
	 */
	protected <T> void setFailState(BaseModel<T> ba) {
		ba.setMessage(BaseConstants.FAIL_STATE_MESSAGE);
		ba.setStatus(BaseConstants.FAIL_STATE_CODE);
		GsonUtil.sendJson(ba);
	}
	
	
	/**
	 * 
	 * @方法功能说明：  发送成功状态码
	 * @创建：2016年11月5日 by Administrator   
	 * @修改：日期 by 修改者  
	 * @修改内容：  
	 * @参数： @param ba
	 * @参数： @param data      
	 * @return void     
	 * @throws
	 */
	protected <T> void setSuccessState(BaseModel<T> ba,T data) {
		ba.setMessage(BaseConstants.SUCESSFUL_STATE_MESSAGE);
		ba.setStatus(BaseConstants.SUCESSFUL_STATE_CODE);
		ba.setData(data);
		GsonUtil.sendJson(ba);
	}
	
	protected <T> void setSuccessState(BaseModel<List<T>> ba,List<T> dataList) {
		ba.setMessage(BaseConstants.SUCESSFUL_STATE_MESSAGE);
		ba.setStatus(BaseConstants.SUCESSFUL_STATE_CODE);
		ba.setData(dataList);
		GsonUtil.sendJson(ba);
	}
	
	/**
	 * 
	 * @方法功能说明：  发送空数据状态码
	 * @创建：2016年11月5日 by wanghao   
	 * @修改：日期 by 修改者  
	 * @修改内容：  
	 * @参数： @param ba      
	 * @return void     
	 * @throws
	 */
	protected <T> void setNullDataState(BaseModel<T> ba) {
		ba.setMessage(BaseConstants.NOT_FOUND_MESSAGE);
		ba.setStatus(BaseConstants.NOT_FOUND_CODE);
		GsonUtil.sendJson(ba);
	}
	
	public String fileUpLoad() {
		String path = ServletActionContext.getServletContext().getRealPath("/img");
		File filepath = new File(path);
		 System.out.println(path);
		BaseModel<String> ba=new BaseModel<String>();
		if(!file.exists()){
			file.mkdir();
		}
		try {
			FileUtils.copyFile(file, new File(filepath,fileFileName));
			ba.setStatus(BaseConstants.SUCESSFUL_STATE_CODE);
			ba.setMessage(BaseConstants.SUCESSFUL_STATE_MESSAGE);
			ba.setData("img/"+fileFileName);
		} catch (IOException e) {
			e.printStackTrace();
			log.error("upload file fail:",e);
			ba.setStatus(BaseConstants.FILE_UPLOAD_FAIL_CODE);
			ba.setMessage(BaseConstants.FILE_UPLOAD_FAIL_MESSAGE);
		}finally{
			GsonUtil.sendJson(ba);
		}
		return Action.SUCCESS;
	}

	
	public String changeDataState(){
		return Action.SUCCESS;
	}
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public String getFileFileName() {
		return fileFileName;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public String getFileContentType() {
		return fileContentType;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
	
}
